package main

import (
	"errors"
	"fmt"
	"io"
	"my-go-chat/message"
	"my-go-chat/process"
	"my-go-chat/utils"
	"net"
)

//依然创建Processor 的结构体  直接将conn封装为结构体进行传递
type Processor struct {
	Conn net.Conn
}

//主控代码 负责处理与每个客户端的连接的主要业务
func (mp *Processor) MainProcess() (err error) {
	//创建操作客户端的连接对象  读取客户端发送的消息
	tf := &utils.Transfer{
		Conn: mp.Conn,
	}
	for {
		//这里将读取数据包的工作封装为一个函数readpkg 返回message err
		mes, err := tf.ReadPkg()
		if err != nil {
			fmt.Println("MainProcess read package error")
			if errors.Is(err, io.EOF) {
				fmt.Println("客户端关闭了连接！")
				return nil
			}
		}
		fmt.Println("mes = ", mes)
		err = mp.ServerProcessMes(&mes)
		if err != nil {
			break
		}
	}
	return
}

//编写ServerProcessMes 函数
// 功能：根据客户端发送消息种类的不同，决定调用哪个函数来处理
func (p *Processor) ServerProcessMes(mes *message.Message) (err error) {
	switch mes.Type {
	case message.LoginMesType:
		//处理登录逻辑
		up := &process.UserProcess{
			Conn: p.Conn,
		}
		err = up.ServerProcessLogin(mes)
		if err != nil {
			fmt.Println("处理登录错误！")
			return
		}
	case message.RegisterMesType:

	default:
		err = errors.New("消息类型未知！")
	}
	return
}
